\section{Entwurf und Implementation}

\subsection{Arduino}
\subsubsection{Aufbau}
Der Aufbau der Steuerung beinhaltet folgende Komponenten:
\begin{itemize}
    \item 1 Arduino One
    \item 1 Breadboard 
    \item 2 Knöpfe 
    \item 1 10K$\Omega$ Potentiometer 
    \item 2 grüne LEDs 
    \item 2 rote LEDs 
    \item 3 gelbe LEDs 
    \item 6 110$\Omega$ Wiederstände 
    \item 2 10K$\Omega$ Wiederstände 
    \item Viele viele Kabel 
\end{itemize}

\subsubsection{Beschreibung der eigentlichen Steuerung}
Im folgenden beschreiben wir die verschiedenen Komponenten, deren Funktionen
und Zweck. \par

Der Arduino One ist das Herzstück unserer Steuerung, da wir durch ihn die
Komponenten, wie Knöpfe, LEDs und Potentiometer, steuern können. Wir haben alle
Komponenten mit ihm verbunden und den Code zur Steuerung der Komponenten auf die
Platine hochgeladen. Den Code selber haben wir mit der gleichnamigen
Software (Arduino) geschrieben. \par
Das Breadboard benutzen wir als Basis zur Platzierung der Komponenten, die schon
oben beim Arduino One erwähnt wurden. Kabel dienen natürlich als Verbindungen. \\

\PictureWide{images/Arduino_Details2.jpg}{Detailansicht des Aufbaus}{adetail}

\textbf{Für die folgenden Beschreibungen ist die Abbildung \ref{fig:adetail} zu betrachten:}\\
Knopf A dient zum Starten und Stoppen unseres MPS. Wenn
das System gestartet wird, beginnt ohne eingreifen einer Person der Ablauf der 
Produktion automatisch. Das erneute Drücken dient als Notaus.\par
Knopf B ist zur Aktivierung der manuellen Steuerung des Schwenkarms zuständig.
Wenn Knopf B gedrückt wird, kann der Schwenkarm mit Hilfe des
Potentiometers bewegt werden. Dieser Knopf funktioniert nur dann, wenn die 
Maschine eingeschaltet ist.\par
Der Potentiometer wird zum bewegen des Schwenkarms verwendet. Je nachdem, wie weit
der Potentiometer gedreht wird, wird auch der Schwenkarm gedreht. Der Schwenkbereich
des Greifarms geht von 0$^\circ$ bis 95$^\circ$. Wenn der Potentiometer in
Mittelstellung ist und die manuelle Steuerung aktiviert wird, dann bewegt sich
der Greifarm direkt zur Mittelstellung. Beim Ausschalten der manuellen
Steuerung geht der Greifarm wieder in die Ausgangsstellung.
Zum Potentiometer lässt sich außerdem erwähnen, dass dieser auf dem Breadboard 
keinen festen Halt hatte und daher immer wieder abgefallen ist. Aus diesem Grund haben wir
eine kleine zusätzliche Konstruktion gebaut. Hierdurch hatte der Potentiometer einen
festen Halt auf dem Breadboard und konnte außerdem besser bedient werden.\par
Dann haben wir noch die sieben LEDs, die zur Darstellung folgender Situationen
benutzt werden: \\
Ist LED 1 eingeschaltet, befindet sich die Maschine im eingeschalteten Modus.\\
Ist LED 2 eingeschaltet, befindet sich die Maschine im abgeschalteten Modus. 
In diesem Modus sind alle anderen LEDs abgeschaltet.\\
Ist LED 3 eingeschaltet, ist die manuelle Steuerung des Schwenkarms im abgeschalteten Modus.\\
Ist LED 4 eingeschaltet, ist die manuelle Steuerung des Schwenkarms aktiviert.\\
Die weiteren LEDs zeigen an, ob Sensoren im MPS aktiviert sind oder nicht.\\
Ist also LED 5 eingeschaltet, bedeutet das, dass ein Puck auf dem Fließband
unter dem Magazin vorhanden ist. Wird dieser Sensor aktiviert kann das
Fließband also starten.\\
Ist LED 6 eingeschaltet, dann bedeutet das, dass der Puck am Ende des Fließbandes
angekommen ist und dieses abgeschaltet werden kann. Außerdem wird dem Schwenkarm so mitgeteilt,
dass etwas zum Aufnehmen auf dem Fließband vorhanden ist.\\
Ist LED 7 eingeschaltet, bedeutet das, dass der Schwenkarm die Endstellung erreicht 
hat und den Puck ablegen kann.\par
Die sechs 110$\Omega$ Wiederstände haben wir jeweils parallel zu zweit an die
LEDs gesetzt, damit die LED nicht zu schwach, aber auch nicht zu stark,
leuchten. \par
Für eine etwas bessere Übersicht, wie unser Aufbau konstruiert worden ist, haben wir
hier nocheinmal den Schaltplan beigefügt.
\PictureWide{images/Der_Masterplan.png}{Schaltplan des Aufbaus}{bdetail}

\subsection{Virtuelle Maschine}
\PictureWide{images/Produkt_Details.png}{Detailansicht der virtuellen Maschine}{mdetail}
Unsere virtuelle Maschine besteht aus den vier Arbeitskomponenten
\begin{itemize}
    \item Magazin,
    \item Fließband,
    \item Schwenk-/Greifarm und
    \item Drehscheibe.
\end{itemize}
In der Abbildung \ref{fig:mdetail} ist zu sehen, wie unser Produkt aussieht und
wie die Komponenten in der virtuellen Welt aufgestellt sind. \par
Das Magazin ist zur Erstellung der Pucks (oder Samples) zuständig, die auf das
Fließband fallen, wenn der rote Knopf an der Steuerung in der virtuellen Welt gedrückt
wird oder der MPS mit Knopf A gestartet wird. \par
Das Fließband transportiert den Puck zum Greifarm. Das Starten wie auch das Halten
des Fließbandes geschieht mittels Sensoren. Fällt ein Puck auf
das Fließband startet es und hält am Ende automatisch an.\\
Zum Starten des Fließbands war vorher der blaue Knopf an der Steuerung vorgesehen.
Dieser ist jetzt ohne Funktion.\par
Der Greifarm wird zum Aufnehmen des Pucks verwendet, damit der Puck auf die
Drehscheibe abgelegt werden kann. \\
Hier nimmt der Greifarm den Puck automatisch, wenn ein Puck am Ende des Fließbandes
liegt und er selber am Ausgangspunkt steht. Wenn der Greifarm dann auf die
Endposition geschwenkt wird, setzt er den Puck auf die Drehscheibe ab. \par
Die Drehscheibe selber sollte sich eigentlich mit den Pucks drehen, doch das hätte
mehr Zeit gekostet, um es zu realisieren.

\subsection{OpenSim Schnittstelle}

Um den Arduino mit OpenSim zu verknüpfen, haben wir ein neues Modul für OpenSim
geschrieben. Dieses Modul erweitert \textit{IRegionModule} und fängt Chat-Events ab und leitet
sie entsprechend an den Arduino weiter. In die andere Richtung werden Events vom Arduino
abgefangen und als Chat-Events im OpenSim an die entsprechenden Scripte weitergereicht.

\subsubsection{Chat Events abfangen}

Das Abfangen und verarbeiten der Chat Events findet in \textit{EventManager\_OnChat} statt.

\subsubsection{Arduino Verknüpfung}

Um Events vom Arduino abzufangen haben wir einen Background-Thread, der konstant ausließt, 
was über die serielle Schnittstelle vom Arduino empfangen wird. Der Input wird verarbeitet
und anschließend an die OpenSim Simulation weitergeleitet.

\subsection{OpenSim Scripte}

Da die Physik-Implementierung von OpenSim für unsere Zwecke unzulänglich ist, steuern
wir den kompletten Verlauf des Produkt-Samples\footnote{Mit einem Sample ist
der Puck in Holzoptik in der virtuellen Welt gemeint.} via Script.\par
Für jeden Abschnitt gibt es einen \textit{state}, der Events abfängt und generiert.
Das Sample wird dann entsprechend verschoben und so die Bewegung durch die Anlage simuliert.

\subsubsection{Sample-Rezzing}

Nachdem die Maschine eingeschaltet wird, wird ein Sample erstellt (beziehungsweise aus dem
Inventar des Startpunkts kopiert [rezzing]).

\subsubsection{Fließband}

Der nächste Schritt ist die Bewegung über das Fließband. Dies wird auch durch einen simplen
Funktionsaufruf erledigt.

\subsubsection{Greifarm}

Die Simulierung des Greifarms ist etwas komplexer. Hier wird die Position des Samples je nach
aktueller Lage des Potentiometers und (Co)Sinus Berechung angepasst. Nachdem die Endposition
erreicht wurde, wird das Sample auf die Drehscheibe abgeworfen.

\subsubsection{Weiterführende Verarbeitung}

Die weiterführende Verarbeitung haben wir nicht implementiert, da sie nach den selben Prinzipien
ablaufen würde und lediglich mehr Zeit gekostet hätte.
